'''
    第五周作业 CSDN Blog热门博客标题提取，同时抓取页面到本地
    @author  宛茹
'''

import urllib.request as ur
# 正则表达式
import lxml.etree as le
# 代理模式
import user_agent


# 2. 通过URL获得一个request对象，注意是通过user-agent方法，headers里边定义一个字典
# 加cookie，第二个页面抓取不到title的原因
def getRequest(url):
    # 需要将 user_agent.py文件拷贝进来 get_user_agent_pc()是电脑端获取一个随机的用户代理
    return ur.Request(
        url=url,
        headers={
            'User-Agent': user_agent.get_user_agent_pc(),
            'Cookie':'TINGYUN_DATA=%7B%22id%22%3A%22-sf2Cni530g%23HL5wvli0FZI%22%2C%22n%22%3A%22WebAction%2FCI%2Farticle%252Fdetails%22%2C%22tid%22%3A%22128d237a6041d9c%22%2C%22q%22%3A0%2C%22a%22%3A92%7D; uuid_tt_dd=10_20713529530-1575173655219-548443; dc_session_id=10_1575173655219.573959; Hm_ct_6bcd52f51e9b3dce32bec4a3997715ac=6525*1*10_20713529530-1575173655219-548443; announcement=%257B%2522isLogin%2522%253Afalse%252C%2522announcementUrl%2522%253A%2522https%253A%252F%252Fblogdev.blog.csdn.net%252Farticle%252Fdetails%252F103053996%2522%252C%2522announcementCount%2522%253A0%252C%2522announcementExpire%2522%253A3600000%257D; acw_tc=2760825015751737361225114e69d2b7b014051f4f4a3b1d9f85f79de32923; firstDie=1; Hm_lvt_6bcd52f51e9b3dce32bec4a3997715ac=1575173656,1575174526; acw_sc__v2=5de34aa848d85d7f80a8a8de3fa6d82c8e197ec2; dc_tos=q1ti94; Hm_lpvt_6bcd52f51e9b3dce32bec4a3997715ac=1575176873; c-login-auto=6'
        }
    )

# 3. 构建一个opener对象 用于配置代理IP
def getProxyOpener():
    proxy_address = ur.urlopen(
        'http://api.ip.data5u.com/dynamic/get.html?order=7b79c38ee36c76367fef682dd80d4b5f&sep=3').read().decode(
        'utf-8').strip()
    proxy_handler = ur.ProxyHandler(
        {
            'http': proxy_address
        }
    )
    return ur.build_opener(proxy_handler)


# 为用户定制输入框
keyword = input('请输入要查找的内容：')
# 将字符串转换为页码整型
pn_start = int(input('起始页码：'))
pn_end = int(input('终止页码：'))

# 对页码进行循环，注意pn_end需要+1，因为循环不会包裹最后一个页码
for pn in range(pn_start, pn_end+1):
    # 1. 将参数代入一级页面的URL，关键信息页码p和关键字q，用%s 占位符替代，然后用 %s (pn,keyword) 表示替换
    # https://so.csdn.net/so/search/s.do?p=5&q=linux&t=blog&viparticle=&domain=&o=&s=&u=&l=&f=&rbg=0
    url = 'https://so.csdn.net/so/search/s.do?p=%s&q=%s&t=blog&viparticle=&domain=&o=&s=&u=&l=&f=&rbg=0' % (pn,keyword)

    # 2. 通过URL获得一个request对象，注意是通过user-agent方法，headers里边定义一个字典
    # 需要将 user_agent.py文件拷贝进来 get_user_agent_pc()是电脑端获取一个随机的用户代理
    request = getRequest(url)

    try:
        # 3. 构建一个opener对象 用于配置代理IP
        response = getProxyOpener().open(request).read()
        # print(response)

        # 4. 返回的response是一个字节对象，将response加载成XML类型的对象，通过xpath进行解析
        # 解析XPATH，获取热门帖子（有阅读量）的url链接
        # 1) 获取阅读量（热门帖子）代码块 //span[@class="down fr"]
        # 2) 通过该代码块定位到父级代码  /span[@class="link"]/a/@   @表示href属性
        # 3) 返回热门贴的href列表
        href_s = le.HTML(response).xpath('//span[@class="down fr"]/../span[@class="link"]/a/@href')
        # 返回URL地址
        # print(href_s)

        # 5. 遍历热门贴的URL地址，二级地址
        for href in href_s:
            print(href)
            try:
                response_blog = getProxyOpener().open(
                    getRequest(href)
                ).read()
                # print(href)
                # 对response_blog再做xpath分析，返回blog标题，获取[0]第一个
                title = le.HTML(response_blog).xpath('//h1[@class="title-article"]/text()')[0]
                print(title)
                # 同时写入本地文件，抓取页面
                with open('blog/%s.html' % title,'wb') as f:
                    f.write(response_blog)
            except Exception as e:
                print(e)
    except:pass












